/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.ejb;

import com.entidades.Usuario;
import com.exceptions.BancoException;

import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

/**
 *
 * @author JERONIMO
 */
@Stateless
public class UsuarioFacade extends AbstractFacade<Usuario> {
    @PersistenceContext(unitName = "Cualquiera-ejbPU")
    private EntityManager em;

    @Override
    protected EntityManager getEntityManager() {
        return em;
    }

    public UsuarioFacade() {
        super(Usuario.class);
    }
     public Usuario Consultar(String correoelectronico){
        Query  q = em.createNamedQuery("Usuario.findByCorreoelectronico");
        q.setParameter("correoelectronico", correoelectronico);
        try{
           return ((Usuario)q.getSingleResult());
        }catch(NoResultException nre){
            return null;
        }
     }  
        
     public void crearCliente(Usuario usuario) throws BancoException{

       //Se verifica si el cliente ya existe;
         System.out.print("Se verifica si el cliente ya existe");
        Usuario cte = findByIdentificacion(usuario.getCedula());
        Usuario cte1 = findByCorreo(usuario.getCorreoelectronico());
        if(cte!= null){
            throw new BancoException("El cliente " +usuario.getNombre()+ "con cedula " + usuario.getCedula() +" ya existe en el sistema");
        }
        if(cte1!= null)
        {
            throw new BancoException("El correo "+usuario.getCorreoelectronico()+" Ya esta asociado a un usuario");
        }
        em.persist(usuario);
        //super.create(cliente);
    }
    @TransactionAttribute(TransactionAttributeType.SUPPORTS)
    public Usuario findByIdentificacion( long cedula){
        Query  q = em.createNamedQuery("Usuario.findByCedula");
        q.setParameter("cedula", cedula);
        try{
           return ((Usuario)q.getSingleResult());
        }catch(NoResultException nre){
            return null;
        }
        
    }
    
     public Usuario findByCorreo( String correo){
        Query  q = em.createNamedQuery("Usuario.findByCorreoelectronico");
        q.setParameter("correoelectronico", correo);
        try{
           return ((Usuario)q.getSingleResult());
        }catch(NoResultException nre){
            return null;
        }
        
    }
    
        public Usuario modificarCliente(Usuario cte){
        if (em.contains(cte)){
            System.out.println("Cliente " + cte.getCedula() + " SI existe en el contexto de persistencia!" );
        }else{
            System.out.println("Cliente " + cte.getCedula() + " NO existe en el contexto de persistencia!" );
        }
        System.out.println("Nombre :" + cte.getNombre());
        return cte = em.merge(cte);
        
    }
     @TransactionAttribute(TransactionAttributeType.SUPPORTS)
    public Usuario findById(long clienteId) {
        Query  q = em.createNamedQuery("Cliente.findById");
        q.setParameter("id", clienteId);
        try{
           return ((Usuario)q.getSingleResult());
        }catch(NoResultException nre){
            return null;
        }       
    }
     
        @TransactionAttribute(TransactionAttributeType.SUPPORTS)
    public Usuario findByCedula(long cedula) {
        Query  q = em.createNamedQuery("Usuario.findByCedula");
        q.setParameter("cedula", cedula);
        try{
           return ((Usuario)q.getSingleResult());
        }catch(NoResultException nre){
            return null;
        }       
    }

     


  

}
